package cn.cytong.util;

import cn.cytong.nk0713.utils.nutz.CustomisedNutDao;
import org.joda.time.DateTime;
import org.nutz.dao.Cnd;
import org.nutz.dao.entity.Record;
import org.nutz.dao.util.cri.SimpleCriteria;

import java.util.Calendar;
import java.util.Date;

import static org.apache.commons.lang3.Validate.isTrue;
import static org.apache.commons.lang3.Validate.notNull;

public class CardTool {
    private static int monthInAdvance = 1;
    private static int period = 365; // 此处不是364

    /**
     * 是否可以续期
     *
     * @param endAt
     */
    public static boolean canRenewal(Date endAt) {
        if (endAt == null) return false;

        Date now = new Date();

        // 可续期的时间是有效期的前一个月
        Date date = DateTool.add(endAt, Calendar.MONTH, monthInAdvance * -3);

        return now.getTime() > date.getTime();
    }

    public static Record canRenewal(CustomisedNutDao nutDao, String cardId, String cardNo) throws Exception {
        // 不能都为空
        if (StringTool.isEmpty(cardId) && StringTool.isEmpty(cardNo)) return null;

        SimpleCriteria cri = Cnd.cri();
        if (StringTool.isNotEmpty(cardId)) {
            cri.where().andEquals("cardId", cardId);
        } else if (StringTool.isNotEmpty(cardNo)) {
            cri.where().andEquals("cardNo", cardNo);
        }
        Record card = nutDao.fetchRecordWithCriteria("select * from card $condition", cri);
        // 1、未找到卡
        notNull(card, "卡号（%s）不存在！", cardNo);
        // 2、未激活
        isTrue(card.getInt("isActive") == 1, "年卡未激活，不能续费！");
        // 3、2013年的工行联名卡不支持续期
        /*if ((Integer) card.get("yearcode") == 2013) {
            isTrue((Integer) card.get("cardType") == 1, "2013年的工行联名卡不支持续期，\n请重新办理年卡！");
        }*/

        //4、 一个月以内才可以续期
        Date endAt = (Date) card.get("endAt");
        isTrue(CardTool.canRenewal(endAt), "续期失败：到期前一个月内才能续期！\n年卡卡号：%s\n结束时间：%s",
                cardNo, new DateTime(card.get("endAt")).toString("yyyy-MM-dd"));

        return card;
    }

    public static boolean canRenewal(Record card) {
        // 1、未找到卡
        if (card == null) return false;

        // 2、未激活
        if (card.getInt("isActive") != 1) return false;

        // 3、2013年的工行联名卡不支持续期
        if (card.getInt("yearcode") == 2013 && card.getInt("cardType") != 1) return false;

        //4、 一个月以内才可以续期
        if (!canRenewal((Date) card.get("endAt"))) return false;

        return true;
    }

    /**
     * 获取续期的结束时间
     *
     * @param endAt
     * @return
     */
    public static Date getRenewalEndDate(Date endAt) {
        if (endAt == null) return null;

        DateTime startAt = new DateTime(endAt).withTimeAtStartOfDay().plusDays(1);
        DateTime today = new DateTime().withTimeAtStartOfDay();
        if (today.isAfter(startAt)) {
            startAt = today;
        }

        return startAt.plusDays(period - 1).toDate();
    }
}
